home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 60750 / 60750.xpi / chrome / chromeFiles / content / btUtilities.js < prev    next >
Text File  |  2010-01-20  |  37KB  |  981 lines

  1. /* This filech contains helper functions */
  2. /* It has to be included AFTER btClient.js */
  3.  
  4. BrandThunder.initialize = function(brandObject) {
  5.   var AMO = false;
  6.   var prefbranch=Components.classes["@mozilla.org/preferences-service;1"]
  7.                            .getService(Components.interfaces.nsIPrefBranch);
  8.   prefbranch.QueryInterface(Components.interfaces.nsIPrefBranch2);
  9.  
  10.   var btPrefBranch = Components.classes["@mozilla.org/preferences-service;1"]
  11.                                .getService(Components.interfaces.nsIPrefService)
  12.                                .getBranch("extensions.brandthunder.");
  13.  
  14.   var searchSvc = Components.classes["@mozilla.org/browser/search-service;1"]
  15.                             .getService(Components.interfaces.nsIBrowserSearchService);
  16.  
  17.   if (!brandObject.utilities) {
  18.     brandObject.utilities = {};
  19.   }
  20.   function log(string) {
  21.     var aConsoleService = Components.classes["@mozilla.org/consoleservice;1"]
  22.                                  .getService(Components.interfaces.nsIConsoleService);   
  23.     aConsoleService.logStringMessage(string);
  24.   }
  25.  
  26.   function openLink(brandObject, event, url) {
  27.     var tab = getBrowser().addTab(url);
  28.     getBrowser().selectedTab = tab;
  29.     return;
  30.   }
  31.  
  32.   function restartApp() {
  33.     // Notify all windows that an application quit has been requested.
  34.     var os = Components.classes["@mozilla.org/observer-service;1"]
  35.                        .getService(Components.interfaces.nsIObserverService);
  36.     var cancelQuit = Components.classes["@mozilla.org/supports-PRBool;1"]
  37.                                .createInstance(Components.interfaces.nsISupportsPRBool);
  38.     os.notifyObservers(cancelQuit, "quit-application-requested", "restart");
  39.   
  40.     // Something aborted the quit process.
  41.     if (cancelQuit.data)
  42.       return;
  43.     var nsIAppStartup = Components.classes["@mozilla.org/toolkit/app-startup;1"]
  44.                                         .getService(Components.interfaces.nsIAppStartup);
  45.     nsIAppStartup.quit(nsIAppStartup.eRestart | nsIAppStartup.eAttemptQuit);    
  46.   }
  47.  
  48.   /* check to see if we should prompt for bing upgrade */
  49.   function upgradeToBing(btClientBundle) {
  50.     if (searchSvc.currentEngine.description == "Yahoo - BT") {
  51.       return;
  52.     }
  53.     if (searchSvc.currentEngine.description == "Yahoo! - BT") {
  54.       return;
  55.     }
  56.     if (searchSvc.currentEngine.description == "Ask - BT") {
  57.       return;
  58.     }
  59.     if (searchSvc.currentEngine.description == "Bing - BT") {
  60.       return;
  61.     }
  62.     if (searchSvc.currentEngine.name == "Bing") {
  63.       setDefaultSearchEngine(brandObject, true);
  64.       return;
  65.     }
  66.     function bingPrompt() {
  67.       btPrefBranch.setBoolPref("offeredBing", true);
  68.       var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
  69.                                     .getService(Components.interfaces.nsIPromptService);
  70.       var state = {};
  71.       state.value = true;
  72.       promptService.confirmEx(window, btClientBundle.getString("clientName"),
  73.                               btClientBundle.getString("bing.upgrade.message"),
  74.                               promptService.BUTTON_TITLE_OK,                                       
  75.                               null,null,null,btClientBundle.getString("bing.upgrade.checkbox"),state);
  76.       if (state.value == true) {
  77.         setDefaultSearchEngine(brandObject, true);
  78.       }
  79.     }
  80.     window.setTimeout(bingPrompt, 0);
  81.   }
  82.  
  83.   /* This function changes Yahoo from BT Yahoo back to regular yahoo */
  84.   function replaceYahoo() {
  85.     var offeredBing = false;
  86.     try {
  87.       offeredBing = btPrefBranch.getBoolPref("offeredBing");
  88.       if (offeredBing) {
  89.         return false;
  90.       }
  91.     } catch (ex) {
  92.     }
  93.     
  94.     var oldPosition;
  95.     var oldEngine;
  96.  
  97.     var visibleEngines = searchSvc.getVisibleEngines({});
  98.     var defaultEngine = false;
  99.  
  100.     for (let i=0; i < visibleEngines.length; i++) {
  101.       if ((visibleEngines[i].name == "Yahoo!") &&
  102.          (visibleEngines[i].description == "Yahoo! - BT")) {
  103.         oldPosition = i;
  104.         oldEngine = visibleEngines[i];
  105.         break;
  106.       }
  107.     }
  108.  
  109.     /* if we didn't find our Yahoo, bail */
  110.     if (!oldEngine) {
  111.       /* There's a possibility our Yahoo never got added in the first place */
  112.       /* As a fallback, check to see if bing is there */
  113.       var bingEngine = searchSvc.getEngineByName("Bing");
  114.       if (!bingEngine) {
  115.         return true;
  116.       }      
  117.       return false;
  118.     }
  119.  
  120.     if (oldEngine == searchSvc.currentEngine) {
  121.       defaultEngine = true;
  122.     }
  123.  
  124.     searchSvc.removeEngine(oldEngine);
  125.  
  126.     searchSvc.addEngineWithDetails("Yahoo!", "data:image/x-icon;base64,R0lGODlhEAAQAJECAP8AAAAAAP///wAAACH5BAEAAAIALAAAAAAQABAAAAIplI+py+0NogQuyBDEnEd2kHkfFWUamEzmpZSfmaIHPHrRguUm/fT+UwAAOw==",
  127.                                    "", "Yahoo - BT", "GET",
  128.                                    "http://search.yahoo.com/search?ei=utf-8&p={searchTerms}");
  129.  
  130.     var newEngine = searchSvc.getEngineByName("Yahoo!");
  131.  
  132.     searchSvc.moveEngine(newEngine, oldPosition);
  133.     if (defaultEngine) {
  134.       searchSvc.currentEngine = newEngine;
  135.     }
  136.     return true;
  137.   }
  138.  
  139.   /* If replace is set, this function replaces an existing Ask with a new code */
  140.   function addAsk(brandObject, firstrun) {
  141.     var oldPosition;
  142.     var oldEngine;
  143.  
  144.     var visibleEngines = searchSvc.getVisibleEngines({});
  145.     var defaultEngine = false;
  146.  
  147.     for (let i=0; i < visibleEngines.length; i++) {
  148.       if (visibleEngines[i].name == "Ask") {
  149.         oldPosition = i;
  150.         oldEngine = visibleEngines[i];
  151.         break;
  152.       }
  153.     }
  154.  
  155.     /* Don't add an engine unless we are firstrun */
  156.     if (!oldEngine && !firstrun) {
  157.       return undefined;
  158.     }
  159.  
  160.     if (oldEngine == searchSvc.currentEngine) {
  161.       defaultEngine = true;
  162.     }
  163.  
  164.     if (oldEngine) {
  165.       searchSvc.removeEngine(oldEngine);
  166.     }
  167.  
  168.     searchSvc.addEngineWithDetails("Ask", "data:image/x-icon;base64,AAABAAEAEBAAAAEACABoBQAAFgAAACgAAAAQAAAAIAAAAAEACAAAAAAAQAEAAAAAAAAAAAAAAAEAAAAAAACbm5sAAADJAAAA1gAAANMAAADYAAAAyACcnJ0AAADLAAEBywDCwsAAjIy2AH9/gwBdXa4AAAC5AAAAygAwMOEAMjLgADMzvQAEBHwAaGipAAAAzwCtsLEAhYWgAAsLygDq6toAQkK3AGZnigA5O84ACAiuANjY3wAICIsAAADAAGVljgAEBIQAAADfAGNiegAREZAAwsLzAAcHkwAEBZ0Ag4jOAC0twAALC7QAqK7dAKSq1wBycqQABATQAPT04ACYm74ARkaOALO09wAmJnQAJSXJADw9fwAzNc4ALzDCAHp6pACdnZkApKevAL29sQD5+foAkpKcAOzs4AAMDMoAPj7iAKGinACvr6oAT0/wAAwNyQAAANIAlJTaAN/f0QCcnZ0AAADRAF5erQAAAJ8AAADDAAAAzAA1NrwAMTGfAAkJ1QAAAMQAWlqvAHJ31wDMzMAAFhbHAAAAiQBERNIA8fHmAAgI1gCys6oAu7v4AD09ngDDwfoABgbOAM7N9wCYmPUAKyuOABkZmgAyMsEAiYq8AHp68gDDw5sAAgLPALW2rwCdnZgAAAC9AAMD1wCenpgA9fX1AAAArQCCgrIA0dLYAK+vnwB3e9kA5ubSAOfn+AClp6cA3NzDAMHHygBQU9MABATCAG5z2gAcHMQAio/aAAAA2QD19fwAnaHIAIaGogDm5uoAk5N0AK+ytAAMDNUAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////////////////////////////////////+DBgAAAAAASBX///////8GEzQ/Ll5VEUo9aXX///86e08hAg1qUUUiaymAOXf/NxQlglZvIzgzHksFeQxs/xcBEG1aWC1lc2YgCmEEUkE2BwFdaHAkQ3RGRxgqAmcWKwgFD1Q7Yn4xYzx2En0DGf9TBwFbLyZgCVwdQgtuBE7//3xEQD4nA1BZgTVXHwIw/////3pkHEkOTV8aTIR//////////yxyeBsycSj/////////////////////////////////////////////////AAD//wAA//8AAMAfAACABwAAAAEAAAABAAAAAAAAAAAAAAAAAACAAAAAwAAAAPABAAD8BwAA//8AAP//AAA=",
  169.                                    "", "Ask - BT", "GET",
  170.                                    "http://www.ask.com/web?q={searchTerms}&o=" + brandObject.askOriginCode + "&l=dis");
  171.  
  172.     var newEngine = searchSvc.getEngineByName("Ask");
  173.  
  174.     if (oldPosition != undefined) {
  175.       searchSvc.moveEngine(newEngine, oldPosition);
  176.       if (defaultEngine) {
  177.         searchSvc.currentEngine = newEngine;
  178.       }
  179.     }
  180.     return newEngine;
  181.   }
  182.  
  183.   /* If replace is set, this function replaces an existing Bing with a new code */
  184.   function addBing(brandObject, firstrun) {
  185.     var oldPosition;
  186.     var oldEngine;
  187.  
  188.     var visibleEngines = searchSvc.getVisibleEngines({});
  189.     var defaultEngine = false;
  190.  
  191.     for (let i=0; i < visibleEngines.length; i++) {
  192.       if (visibleEngines[i].name == "Bing") {
  193.         oldPosition = i;
  194.         oldEngine = visibleEngines[i];
  195.         break;
  196.       }
  197.     }
  198.  
  199.     /* Don't add an engine unless we are firstrun */
  200.     if (!oldEngine && !firstrun) {
  201.       return undefined;
  202.     }
  203.  
  204.     if (oldEngine == searchSvc.currentEngine) {
  205.       defaultEngine = true;
  206.     }
  207.    
  208.     if (oldEngine) {
  209.       searchSvc.removeEngine(oldEngine);
  210.     }
  211.  
  212.     searchSvc.addEngineWithDetails("Bing", "data:image/x-icon;base64," +
  213.                                    "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABmElEQVR4nK2TvS8DcRzGP3dV6Utw" +
  214.                                    "baNLm7hBY0A0BgaDW8/U3YDJVDHaXOIvEKOBRWJk0VENJN1Qg4R4iw4q5Wj6EnJ+hrtrcppIpL7j" +
  215.                                    "7+V5nu/zfb6SEIJOSiJ7IQC0VJjDrCr9FUDuiP4/ALp+HpyVmmLvvMppqYHZ+AJACcqkE0G0VIjp" +
  216.                                    "wbCnzZYHatQPwN3L56+MatSPMRNnbkKRPABu9QVlDD1OZrQHNdZtg1Y+yF/XMHLP3DsE85MKW7MJ" +
  217.                                    "yQMwlgiQz6ooIR+8XsBjzr5I6hAZwaxbaBt3nJWaABh63KvgdjVls97sQmHJq318DYYWMesWkZVL" +
  218.                                    "xxufdwquZG5325t31CghH9ODIQDMhoXsmuf2CkB8qh1AGbE/1S2OruutY8k4KAsjV2734OkYyif2" +
  219.                                    "q8gwJGcAyGw+sF+sArCsxZCEECzslMR2wQRgIOrH0PvJjPbaQA7rXvHdMwU3+pK7TOv5ijByz5gN" +
  220.                                    "y6O8Lyjz5gTKNW5Zi7Gq99s5+LmN+8WqyF/VOHVG5VY6ESCdDLQC1PKg03X+BvY0nUiiaSr8AAAA" +
  221.                                    "AElFTkSuQmCC",
  222.                                    "", "Bing - BT", "GET",
  223.                                    "http://www.bing.com/search?q={searchTerms}&PC=BRTH&FORM=" + brandObject.bingFormCode);
  224.  
  225.     var newEngine = searchSvc.getEngineByName("Bing");
  226.  
  227.     if (oldPosition != undefined) {
  228.       searchSvc.moveEngine(newEngine, oldPosition);
  229.       if (defaultEngine) {
  230.         searchSvc.currentEngine = newEngine;
  231.       }
  232.     }
  233.     return newEngine;
  234.   }
  235.  
  236.   /* This functions updates the BT Search Engines with the current boom info */
  237.   function updateKeywordSearch(brandObject) {
  238.     /* keyword.URL */
  239.     var keywordSearch = true;
  240.     try {
  241.       keywordSearch = btPrefBranch.getBoolPref("keywordSearch");
  242.     } catch (ex) {}
  243.  
  244.     if (keywordSearch) {
  245.       var currentEngineDescription = searchSvc.currentEngine.description;
  246.  
  247.       if ((currentEngineDescription != "Ask - BT") &&
  248.           (currentEngineDescription != "Bing - BT")) {
  249.         currentEngineDescription = brandObject.defaultSearchEngine;
  250.       }
  251.  
  252.       switch (currentEngineDescription) {
  253.         case "Ask - BT":
  254.           prefbranch.setCharPref("keyword.URL", "http://www.ask.com/web?o=" + brandObject.askOriginCode + "&l=dis&q=");
  255.           break;
  256.         case "Bing - BT":
  257.           prefbranch.setCharPref("keyword.URL", "http://www.bing.com/search?PC=BRTH&FORM=" + brandObject.bingFormCode + "&q=");
  258.           break;
  259.       }
  260.     }
  261.   }
  262.  
  263.   /* This functions updates the BT Search Engines with the current boom info */
  264.   function updateSearchEngine(brandObject) {
  265.     var currentEngine = searchSvc.currentEngine;
  266.  
  267.     if (brandObject.askOriginCode) {
  268.       addAsk(brandObject, false)
  269.     }
  270.     if (brandObject.bingFormCode) {
  271.       addBing(brandObject, false)
  272.     }
  273.     updateKeywordSearch(brandObject);
  274.   }
  275.  
  276.   /* This function checks to see if the default engine is the same as THIS BOOM! */
  277.   function isDefaultSearchEngineBT(brandObject) {
  278.     var searchSvc = Components.classes["@mozilla.org/browser/search-service;1"]
  279.                               .getService(Components.interfaces.nsIBrowserSearchService);
  280.     var currentEngine = searchSvc.currentEngine;
  281.     if (currentEngine.description == brandObject.defaultSearchEngine) {
  282.       return true;
  283.     }
  284.     return false;
  285.   }
  286.  
  287.   /* optin indicates whether someone chose to do this or not */
  288.   function setDefaultSearchEngine(brandObject, optin) {
  289.     /* This assumes we've already added engines */
  290.     var searchSvc = Components.classes["@mozilla.org/browser/search-service;1"]
  291.                               .getService(Components.interfaces.nsIBrowserSearchService);
  292.  
  293.     var currentEngine = searchSvc.currentEngine.description;
  294.     var keywordSearch = true;
  295.     try {
  296.       keywordSearch = btPrefBranch.getBoolPref("keywordSearch");
  297.     } catch (ex) {}
  298.  
  299.     var newEngine;
  300.     switch (brandObject.defaultSearchEngine) {
  301.       case "Ask - BT":
  302.         var engine = searchSvc.getEngineByName("Ask");
  303.         if (engine.description == "Ask - BT") {
  304.           newEngine = engine;
  305.         }
  306.         if (keywordSearch) {
  307.           prefbranch.setCharPref("keyword.URL", "http://www.ask.com/web?o=" + brandObject.askOriginCode + "&l=dis&q=");
  308.         }
  309.         break;
  310.       case "Bing - BT":
  311.         newEngine = searchSvc.getEngineByName("Bing");
  312.         if (keywordSearch) {
  313.           prefbranch.setCharPref("keyword.URL", "http://www.bing.com/search?PC=BRTH&FORM=" + brandObject.bingFormCode + "&q=");
  314.         }
  315.         break;
  316.     }
  317.     if (optin && !newEngine) {
  318.       /* We got here because there was optin, but we didn't add an engine because */
  319.       /* we couldn't step into a revenue connection. Because they opted in, we can */
  320.       switch (brandObject.defaultSearchEngine) {
  321.         case "Ask - BT":
  322.           newEngine = addAsk(brandObject, true);
  323.           break;
  324.         case "Bing - BT":
  325.           newEngine = addBing(brandObject, true);
  326.           break;
  327.       }
  328.     }
  329.     if (newEngine) {
  330.       searchSvc.currentEngine = newEngine;
  331.     }
  332.  
  333.     btPrefBranch.setBoolPref("keywordSearch", true);
  334.     btPrefBranch.setBoolPref("tabSearch", true);
  335.   }
  336.  
  337.   function addSearchEngine(brandObject) {
  338.     var searchSvc = Components.classes["@mozilla.org/browser/search-service;1"]
  339.                               .getService(Components.interfaces.nsIBrowserSearchService);
  340.     var selectedEngine;
  341.     try {
  342.       selectedEngineName = prefbranch.getCharPref("browser.search.selectedEngine");
  343.     } catch (ex) {
  344.       selectedEngineName = searchSvc.currentEngine.name;
  345.     }
  346.     selectedEngine = searchSvc.getEngineByName(selectedEngineName);
  347.  
  348.     var addedAsk = false;
  349.  
  350.     if (brandObject.askOriginCode) {
  351.       var askPosition;
  352.       /* If they don't have an Ask, add it */
  353.       var askEngine = searchSvc.getEngineByName("Ask");
  354.       /* We only add our Ask if there is no other Ask */
  355.       if (!askEngine) {
  356.         addAsk(brandObject, true);
  357.         addedAsk = true;
  358.       }
  359.     }
  360.  
  361.     var addedBing = !!addBing(brandObject, true);
  362.  
  363.     /* Bail if it is an AMO build */
  364.     if (AMO) {
  365.       if (searchSvc.currentEngine.description == "Bing - BT") {
  366.         /* Edge case - AMO install with Bing as default, set keyword and tab prefs */
  367.         btPrefBranch.setBoolPref("keywordSearch", true);
  368.         btPrefBranch.setBoolPref("tabSearch", true);
  369.       }
  370.       return;
  371.     }
  372.  
  373.     var yahooEngine;
  374.     var newAskEngine;
  375.     var newBingEngine;
  376.     yahooEngine = searchSvc.getEngineByName("Yahoo");
  377.     if (addedAsk) {
  378.       newAskEngine = searchSvc.getEngineByName("Ask");
  379.     }
  380.     if (addedBing) {
  381.       newBingEngine = searchSvc.getEngineByName("Bing");
  382.     }
  383.  
  384.     switch (brandObject.defaultSearchEngine) {
  385.       case "Ask - BT":
  386.         if (newBingEngine) {
  387.           searchSvc.moveEngine(newBingEngine, 0);
  388.         }
  389.         if (yahooEngine) {
  390.           try {
  391.             searchSvc.moveEngine(yahooEngine, 0);
  392.           } catch(ex) {
  393.             /* Might fail if Yahoo is hidden - just ignore */
  394.           }
  395.         }
  396.         if (newAskEngine) {
  397.           searchSvc.moveEngine(newAskEngine, 0);
  398.         }
  399.         break;
  400.       case "Bing - BT":
  401.         if (newAskEngine) {
  402.           searchSvc.moveEngine(newAskEngine, 0);
  403.         }
  404.           try {
  405.             searchSvc.moveEngine(yahooEngine, 0);
  406.           } catch(ex) {
  407.             /* Might fail if Yahoo is hidden - just ignore */
  408.           }
  409.         if (newBingEngine) {
  410.           searchSvc.moveEngine(newBingEngine, 0);
  411.         }
  412.         break;
  413.     }
  414.   }
  415.  
  416.   function addBookmark(title, url, container) {
  417.     if (!container) {
  418.       container = bookmarks.bookmarksMenuFolder;
  419.     }
  420.     var bookmarks = Components.classes["@mozilla.org/browser/nav-bookmarks-service;1"]
  421.                               .getService(Components.interfaces.nsINavBookmarksService);
  422.     var ioService = Components.classes["@mozilla.org/network/io-service;1"]
  423.                                 .getService(Components.interfaces.nsIIOService);
  424.     var uri = ioService.newURI(url, null, null);
  425.     bookmarks.insertBookmark(container, uri, -1, title);
  426.   }
  427.  
  428.   function toggleTheme(brandObject) {
  429.     if (prefbranch.getCharPref("general.skins.selectedSkin") != "classic/1.0") {
  430.       return;      
  431.     }
  432.  
  433.     var currentBoom = btPrefBranch.getCharPref("currentBoom");
  434.     var bigBoom = true;
  435.     try {
  436.       bigBoom = btPrefBranch.getBoolPref("bigBoom");
  437.     } catch (ex) {
  438.     }    
  439.     if (bigBoom) {
  440.       var boomClient;
  441.       for (let i in BrandThunder.clients) {
  442.         for (let j in BrandThunder.clients[i].booms) {
  443.           if (j == currentBoom) {
  444.             boomClient = i;
  445.             break;
  446.           }
  447.         }
  448.       }
  449.       if (brandObject && (boomClient != brandObject.shortName)) {
  450.         return;
  451.       }
  452.       if (brandObject.utilities.LightweightThemeManager) {
  453.         if (brandObject.utilities.LightweightThemeManager.currentTheme) {
  454.           brandObject.utilities.LightweightThemeManager.currentTheme = null;
  455.         }
  456.       }
  457.       document.getElementById("main-window").setAttribute("btBoom", currentBoom);
  458.       document.getElementById("main-window").setAttribute("bt-theme", currentBoom);
  459.       document.getElementById("main-window").setAttribute("btClient", boomClient);
  460.       /* If we have a home page, set it, otherwise remove attribute if it is there */
  461.       if (brandObject.homePage) {
  462.         var homePage;
  463.         if (typeof(brandObject.homePage) == "object") {
  464.           homePage = brandObject.homePage[currentBoom];
  465.         } else {
  466.           homePage = brandObject.homePage;
  467.         }
  468.         document.getElementById("main-window").setAttribute("btURLLeft", homePage);
  469.       } else {
  470.         document.getElementById("main-window").removeAttribute("btURLLeft");
  471.       }
  472.     } else {
  473.       document.getElementById("main-window").removeAttribute("btBoom");
  474.       document.getElementById("main-window").removeAttribute("bt-theme");
  475.       document.getElementById("main-window").removeAttribute("btClient");
  476.       /* Remove URLs from main window when we are switched to small boom */
  477.       document.getElementById("main-window").removeAttribute("btURLLeft");
  478.       document.getElementById("main-window").removeAttribute("btURLRight");
  479.     }
  480.   }
  481.   function switchBoom(brandObject, boomSwitch) {
  482.     /* Get the current boom */
  483.     var currentBoom = btPrefBranch.getCharPref("currentBoom");
  484.  
  485.     /* Find the client that corresponds to the current boom */
  486.     var boomClient;
  487.     for (let i in BrandThunder.clients) {
  488.       for (let j in BrandThunder.clients[i].booms) {
  489.         if (j == currentBoom) {
  490.           boomClient = i;
  491.           break;
  492.         }
  493.       }
  494.     }
  495.     /* If we didn't find a boomClient, must be invalid currentBoom */
  496.     /* Set currentBoom and return. We'll come back through this code again */
  497.     if (!boomClient) {
  498.       for (let i in brandObject.booms) {
  499.         btPrefBranch.setCharPref("currentBoom", i);
  500.         return; 
  501.       }
  502.     } else {
  503.       if (boomClient != brandObject.shortName) {
  504.         return;
  505.       }
  506.     }
  507.     /* If boomSwitch is set, this came as the result of the pref change */
  508.     /* Set the pref and let the big boom come through toggleTheme as a */
  509.     /* result of the pref change. Otherwise, call toggleTheme directly */
  510.     var bigBoom= true;
  511.     try {
  512.       bigBoom = btPrefBranch.getBoolPref("bigBoom");
  513.     } catch (ex) {
  514.     }
  515.     if (!bigBoom && boomSwitch) {
  516.       btPrefBranch.setBoolPref("bigBoom", true);
  517.     } else {
  518.       toggleTheme(brandObject);
  519.     }
  520.  
  521.     /* Figure out which toolbar applies to the current boom */
  522.     /* Note this can be either a boom specific toolbar or a client specific toolbar */
  523.     var toolbarRDF;
  524.     var boomToolbar;
  525.     var toolbar = document.getElementById("bt-" + currentBoom + "-toolbar");
  526.     if (toolbar) {
  527.       boomToolbar = currentBoom;
  528.       toolbarRDF = "chrome://browser/content/browser.xul#bt-" + currentBoom + "-toolbar";
  529.     } else {
  530.       /* Might be a client toolbar */
  531.       toolbar = document.getElementById("bt-" + boomClient + "-toolbar");
  532.       if (toolbar) {
  533.         boomToolbar = boomClient;
  534.         toolbarRDF = "chrome://browser/content/browser.xul#bt-" + boomClient + "-toolbar";
  535.       }
  536.     }
  537.     /* If we have a toolbar, show it */
  538.     if (toolbar) {
  539.       /* Honor user's collapsed settings */
  540.       try {
  541.         var rdf = Components.classes["@mozilla.org/rdf/rdf-service;1"].getService(Components.interfaces.nsIRDFService);
  542.         var dataSource = rdf.GetDataSource("rdf:local-store");
  543.         var collapsedResource = rdf.GetResource("collapsed");
  544.         toolbarRDF = rdf.GetResource(toolbarRDF);
  545.         var target = dataSource.GetTarget(toolbarRDF, collapsedResource, true);
  546.         if (target instanceof Components.interfaces.nsIRDFLiteral) {
  547.           if (target.Value == "true") {
  548.             toolbar.collapsed = true;
  549.           } else {
  550.             toolbar.collapsed = false;
  551.           }
  552.         } else {
  553.           toolbar.collapsed = false;
  554.         }
  555.       } catch(ex) {
  556.         toolbar.collapsed = false;
  557.       }
  558.       toolbar.setAttribute("toolbarname", toolbar.getAttribute("bt-toolbarname"));
  559.       var navbar = document.getElementById("nav-bar");
  560. //      if (navbar.nextSibling.id != "bt-" + currToolbar + "-toolbar") {
  561.       if (navbar.nextSibling != toolbar) {
  562.         navbar.parentNode.insertBefore(toolbar, navbar.nextSibling)
  563.       }
  564.     }
  565.  
  566.     /* Figure out which sidebar applies to the current boom */
  567.     /* Note this can be either a boom specific sidebar or a client specific sidebar */
  568.     var boomSidebar;
  569.     var sidebarmenu = document.getElementById("bt-" + currentBoom + "-sidebar-menu");
  570.     if (sidebarmenu) {
  571.       boomSidebar = currentBoom;
  572.     } else {
  573.       /* Might be a client toolbar */
  574.       sidebarmenu = document.getElementById("bt-" + boomClient + "-sidebar-menu");
  575.       if (sidebarmenu) {
  576.         boomSidebar = boomClient;
  577.       }
  578.     }
  579.  
  580.     /* Disable everything that doesn't correspond to the current toolbar */
  581.     /* Hide other sidebars */
  582.     for (let i in BrandThunder.clients) {
  583.       for (let j in BrandThunder.clients[i].booms) {
  584.         if (j != boomToolbar) {
  585.           try{
  586.             document.getElementById("bt-" + j + "-toolbar").collapsed = true;
  587.             document.getElementById("bt-" + j + "-toolbar").removeAttribute("toolbarname");
  588.           } catch (ex) {}
  589.         }
  590.         if (j != boomSidebar) {
  591.           try{
  592.             document.getElementById("bt-" + j + "-sidebar-menu").hidden = true;
  593.           } catch (ex) {}
  594.         }
  595.       }
  596.       if (i != boomClient) {
  597.           try{
  598.             document.getElementById("bt-" + i + "-toolbar").collapsed = true;
  599.             document.getElementById("bt-" + i + "-toolbar").removeAttribute("toolbarname");
  600.           } catch (ex) {}        
  601.           try{
  602.             document.getElementById("bt-" + i + "-sidebar-menu").hidden = true;
  603.           } catch (ex) {}        
  604.       }
  605.     }
  606.  
  607.     if (sidebarmenu) {
  608.       sidebarmenu.hidden = false;
  609.     }
  610.     if (!document.getElementById("sidebar-box").hidden) {
  611.       if (document.getElementById("sidebar-box").getAttribute("src").match("btSidebar.xul")) {
  612.         if (boomSidebar) {
  613.           toggleSidebar();
  614.           toggleSidebar("bt-" + boomSidebar + "-sidebar", true);
  615.         } else {
  616.           toggleSidebar();
  617.         }
  618.       }
  619.     }
  620.  
  621.   
  622.     /* Update the search engine to correspond to the current boomClient */
  623.     updateSearchEngine(BrandThunder.clients[boomClient]);
  624.     var updateUserAgent = true;
  625.     try {
  626.       updateUserAgent = btPrefBranch.getBoolPref("updateUserAgent");
  627.     } catch (ex) {}
  628.     if (updateUserAgent) {
  629.       prefbranch.setCharPref("general.useragent.extra.brandthunder", "(BT-" + boomClient + ")");
  630.     }
  631.   }
  632.  
  633.   function uninstall (brandObject, btClientBundle) {
  634.     function postUninstall(brandObject, btClientBundle) {
  635.       brandObject.utilities.openLink(brandObject, null, "http://brandthunder.com/uninstall.php?&type=" + brandObject.shortName);
  636.       
  637.       var button = promptService.confirmEx(window, btClientBundle.getString("clientName"), btClientBundle.getString("restart.confirm"),
  638.                                            (promptService.BUTTON_TITLE_YES * promptService.BUTTON_POS_0) +
  639.                                            (promptService.BUTTON_TITLE_NO * promptService.BUTTON_POS_1),
  640.                                            null, null, null, null, {});
  641.       if (button == 0) {
  642.         brandObject.utilities.restartApp();
  643.       }
  644.     }
  645.     var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
  646.                                     .getService(Components.interfaces.nsIPromptService);
  647.     var em = Components.classes["@mozilla.org/extensions/manager;1"]
  648.                          .getService(Components.interfaces.nsIExtensionManager);
  649.     var name = em.getInstallLocation(brandObject.extensionID).name;
  650.     if (name == "winreg-app-global") {
  651.       const nsIWindowsRegKey = Components.interfaces.nsIWindowsRegKey;
  652.       var key = Components.classes["@mozilla.org/windows-registry-key;1"]
  653.                           .createInstance(nsIWindowsRegKey);
  654.       var rootKey = nsIWindowsRegKey.ROOT_KEY_LOCAL_MACHINE;
  655.       key.create(rootKey, "SOFTWARE\\Mozilla\\Firefox\\Extensions", nsIWindowsRegKey.ACCESS_READ);
  656.       var path = key.readStringValue(brandObject.extensionID);
  657.       var file = Components.classes["@mozilla.org/file/local;1"]
  658.                            .createInstance(Components.interfaces.nsILocalFile);
  659.       file.initWithPath(path + "\\" + "unins000.exe");
  660.       
  661.       var process = Components.classes["@mozilla.org/process/util;1"]
  662.                               .createInstance(Components.interfaces.nsIProcess);
  663.       process.init(file);
  664.       
  665.       var args = [];
  666.       process.run(false, args, args.length);
  667.       function checkUninstallStatus(process, brandObject, btClientBundle) {
  668.         switch (process.exitValue) {
  669.           case -1:
  670.             window.setTimeout(checkUninstallStatus, 1000, process, brandObject, btClientBundle);
  671.             break;
  672.           case 1:
  673.             return;
  674.           case 0:
  675.             window.setTimeout(postUninstall, 2500, brandObject, btClientBundle);
  676.             key.removeValue(brandObject.extensionID);
  677.             break;
  678.         }
  679.       }
  680.       window.setTimeout(checkUninstallStatus, 1000, process, brandObject, btClientBundle);
  681.     } else {
  682.       var button = promptService.confirmEx(window, btClientBundle.getString("clientName"), btClientBundle.getString("uninstall.confirm"),
  683.                                            (promptService.BUTTON_TITLE_YES * promptService.BUTTON_POS_0) +
  684.                                            (promptService.BUTTON_TITLE_NO * promptService.BUTTON_POS_1),
  685.                                            null, null, null, null, {});
  686.       if (button == 0) {
  687.         var observerService = Components.classes["@mozilla.org/observer-service;1"]
  688.                                         .getService(Components.interfaces.nsIObserverService);
  689.         var em = Components.classes["@mozilla.org/extensions/manager;1"]
  690.                            .getService(Components.interfaces.nsIExtensionManager);
  691.         var name = em.getInstallLocation(brandObject.extensionID).name;
  692.         try {
  693.           em.uninstallItem(brandObject.extensionID);
  694.           observerService.notifyObservers(em.getItemForID(brandObject.extensionID),
  695.                                         "em-action-requested", "item-uninstalled");
  696.         } catch(ex) {}
  697.         postUninstall(brandObject, btClientBundle);
  698.       }
  699.     }
  700.   }
  701.  
  702.   function firstRun(brandObject, btClientBundle) {
  703.     var btClientPrefBranch;
  704.     if (brandObject.clientCode) {
  705.       btClientPrefBranch = Components.classes["@mozilla.org/preferences-service;1"]
  706.                                  .getService(Components.interfaces.nsIPrefService)
  707.                                  .getBranch("extensions.brandthunder." + brandObject.clientCode + ".");
  708.     } else {
  709.       btClientPrefBranch = Components.classes["@mozilla.org/preferences-service;1"]
  710.                                  .getService(Components.interfaces.nsIPrefService)
  711.                                  .getBranch("extensions.brandthunder." + brandObject.shortName + ".");
  712.     }
  713.  
  714.     var validBoom = false;
  715.     try {
  716.       var currentBoom = btPrefBranch.getCharPref("currentBoom");
  717.       for (let i in BrandThunder.clients) {
  718.         for (let j in BrandThunder.clients[i].booms) {
  719.           if (j == currentBoom) {
  720.             validBoom = true;
  721.           }
  722.         }
  723.       }
  724.     } catch (ex) {}
  725.  
  726.     if (!validBoom) {
  727.       /* currentBoom is not valid */
  728.       for (let i in brandObject.booms) {
  729.         btPrefBranch.setCharPref("currentBoom", i);
  730.         break;
  731.       }
  732.     }
  733.  
  734.     if (!btClientBundle) {
  735.       btClientBundle = document.getElementById("btClientBundle_" + brandObject.shortName);
  736.     }
  737.     /* If for some reason we didn't get a client bundle, try a boom bundle */
  738.     if (!btClientBundle) {
  739.       btClientBundle = document.getElementById("btBoomBundle_" + currentBoom);
  740.     }
  741.  
  742.     function removeXPIs(brandObject) {
  743.       try {
  744.         var extdir = em.getInstallLocation(brandObject.extensionID)
  745.                          .getItemLocation(brandObject.extensionID);
  746.       } catch (ex) {
  747.         return;
  748.       }
  749.     
  750.       var e = extdir.directoryEntries;
  751.       while (e.hasMoreElements()) {
  752.         var f = e.getNext().QueryInterface(Components.interfaces.nsIFile);
  753.         var splitpath = f.path.split(".");
  754.         /* Only load XPI files */
  755.         if (splitpath[splitpath.length-1] == "xpi") {
  756.           try {
  757.             f.remove(true);
  758.           } catch (ex) {}
  759.         }
  760.       }
  761.     }
  762.  
  763.     function surfCanyonUpgrade(brandObject, btClientBundle){
  764.       var upgradeMessage = btClientBundle.getString("upgradeMessage");
  765.       var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
  766.                                     .getService(Components.interfaces.nsIPromptService);
  767.       var state = {};
  768.       state.value = true;
  769.       promptService.confirmEx(window, btClientBundle.getString("clientName"),
  770.                               upgradeMessage,
  771.                               promptService.BUTTON_TITLE_OK,                                       
  772.                               null,null,null,"Install Surf Canyon on the next restart",state);
  773.       if (state.value == false) {
  774.         removeXPIs(brandObject);
  775.       }
  776.     }
  777.  
  778.     var firstrun = true;
  779.     try {
  780.       firstrun = btClientPrefBranch.getBoolPref("firstrun");
  781.       if (firstrun == false) {
  782.         /* Check if we are an upgrade */
  783.         var upgrade = false;
  784.         try {
  785.           upgrade = btClientPrefBranch.getBoolPref("upgrade");
  786.           if (upgrade) {
  787.             /* If our old Yahoo was there, add bing and ask about upgrading */
  788.             if (replaceYahoo()) {
  789.               addBing(brandObject, true);
  790.               upgradeToBing(btClientBundle);
  791.             }
  792.             try {
  793.               var upgradeMessage = btClientBundle.getString("upgradeMessage");
  794.               /* check if surf canyon is already installed */
  795.               var em = Components.classes["@mozilla.org/extensions/manager;1"]
  796.                                  .getService(Components.interfaces.nsIExtensionManager);
  797.   
  798.               var scinstalled = em.getInstallLocation("{75623d5d-4683-402a-b610-ac4bab767c86}")
  799.               if (!scinstalled) {
  800.                 /* Make sure we have a surf canyon XPI before offering to install it */
  801.                 try {
  802.                   var extdir = em.getInstallLocation(brandObject.extensionID)
  803.                                    .getItemLocation(brandObject.extensionID);
  804.                 } catch (ex) {
  805.                   return;
  806.                 }
  807.  
  808.                 var haveSurfCanyonXPI = false;
  809.                 var e = extdir.directoryEntries;
  810.                 while (e.hasMoreElements()) {
  811.                   var f = e.getNext().QueryInterface(Components.interfaces.nsIFile);
  812.                   if (f.leafName == "surfcanyon_sc.xpi") {
  813.                     haveSurfCanyonXPI = true;
  814.                     break;
  815.                   }
  816.                 }
  817.                 if (haveSurfCanyonXPI) {
  818.                   window.setTimeout(surfCanyonUpgrade, 1500, brandObject, btClientBundle);
  819.                 }
  820.               } else {
  821.                 removeXPIs(brandObject);
  822.               }
  823.             } catch (ex) {
  824.               /* No upgradeMessage specified, so don't display message */
  825.             }
  826.             btClientPrefBranch.clearUserPref("upgrade");          
  827.           }
  828.         } catch (ex) {}
  829.         return;
  830.       }
  831.     } catch (ex) {}
  832.   
  833.     btClientPrefBranch.setBoolPref("firstrun",false);
  834.  
  835.     function firstRunNotifications(brandObject) {
  836.       function askAboutHomepage(event) {
  837.         /* Only ask about home page if the notification happens on one of our pages */
  838.         if (brandObject.welcomePage) {
  839.           if (!(content.document.location.href.match(brandObject.welcomePage))) {
  840.             return;
  841.           }
  842.         } else if (brandObject.startPage) {
  843.           if (content.document.location.href != brandObject.startPage) {
  844.             return;
  845.           }
  846.         } else {
  847.           event.target.removeEventListener("load", askAboutHomepage, false);
  848.           return; 
  849.         }
  850.         event.target.removeEventListener("load", askAboutHomepage, false);
  851.         function yes() {
  852.           var prefbranch=Components.classes["@mozilla.org/preferences-service;1"]
  853.                          .getService(Components.interfaces.nsIPrefBranch);
  854.           var homePage;
  855.           if (typeof(brandObject.homePage) == "object") {
  856.             homePage = brandObject.homePage[currentBoom];
  857.           } else {
  858.             homePage = brandObject.homePage;
  859.           }
  860.           prefbranch.setCharPref("browser.startup.homepage", homePage);
  861.         }
  862.         var nbox_buttons = [
  863.           {
  864.             label: "Yes",
  865.             accessKey: "Y",
  866.             callback: yes,
  867.             popup: null
  868.           },
  869.           {
  870.             label: "No",
  871.             accessKey: "N",
  872.             callback: function() {},
  873.             popup: null 
  874.           }
  875.         ]
  876.         var nbox = gBrowser.getNotificationBox();
  877.         if (brandObject.homePage) {
  878.           try {
  879.             var homepageQuestion = btClientBundle.getString("homepageQuestion");
  880.             nbox.appendNotification(homepageQuestion, "brandthunder",
  881.                                     "chrome://" + brandObject.packageName + "/skin/favicon.png",
  882.                                     nbox.PRIORITY_INFO_HIGH, nbox_buttons);
  883.           } catch (ex) {}
  884.         }
  885.         if (content.document.location.href.match("overlay")) {
  886.           if (!brandObject.utilities.isDefaultSearchEngineBT(brandObject)) {
  887.             var search = content.document.getElementById("search");
  888.             if (search) {
  889.               search.style.display = "block";
  890.             } else {
  891.               /* If we don't have a search block, even if we're AMO, do the switch */
  892.               brandObject.utilities.setDefaultSearchEngine(brandObject, true);
  893.             }
  894.           }
  895.         }
  896.       }
  897.       /* If we have a start page, add it */
  898.       if (brandObject.startPage) {
  899.         gBrowser.selectedTab = gBrowser.addTab(brandObject.startPage);
  900.       }
  901.       /* If we have a welcome page, add it */
  902.       if (brandObject.welcomePage) {
  903.         var welcomePage = brandObject.welcomePage;
  904.         if (brandObject.firstrun || (!brandObject.utilities.isDefaultSearchEngineBT(brandObject) && AMO)) {
  905.           welcomePage += "?overlay";
  906.         }
  907.         gBrowser.selectedTab = gBrowser.addTab(welcomePage);
  908.       }
  909.       gBrowser.selectedTab.addEventListener("load", askAboutHomepage, false);
  910.       if (brandObject.firstRunSidebar) {
  911.         toggleSidebar(brandObject.firstRunSidebar, true);
  912.       }
  913.     }
  914.     /* Delay startup notifications for a 1.5 seconds */
  915.     window.setTimeout(firstRunNotifications, 1500, brandObject);
  916.     if (brandObject.bookmarks) {
  917.       for (let i in brandObject.bookmarks) {
  918.         if (typeof(brandObject.bookmarks[i]) == "object") {
  919.           var bookmarks = Components.classes["@mozilla.org/browser/nav-bookmarks-service;1"]
  920.                                     .getService(Components.interfaces.nsINavBookmarksService);
  921.  
  922.           var folder =  bookmarks.createFolder(bookmarks.bookmarksMenuFolder, i, -1);
  923.  
  924.           for (let j in brandObject.bookmarks[i]) {
  925.             brandObject.utilities.addBookmark(j, brandObject.bookmarks[i][j], folder);
  926.           }
  927.          } else {
  928.           brandObject.utilities.addBookmark(i, brandObject.bookmarks[i]);
  929.         }
  930.       }
  931.     }
  932.     
  933.     brandObject.utilities.addSearchEngine(brandObject);
  934.     if (!AMO) {
  935.       brandObject.utilities.setDefaultSearchEngine(brandObject, false);
  936.     }
  937.   }
  938.  
  939.   brandObject.utilities.openLink = openLink;
  940.   brandObject.utilities.restartApp = restartApp;
  941.   brandObject.utilities.addSearchEngine = addSearchEngine;
  942.   brandObject.utilities.setDefaultSearchEngine = setDefaultSearchEngine;
  943.   brandObject.utilities.isDefaultSearchEngineBT = isDefaultSearchEngineBT;
  944.   brandObject.utilities.addBookmark = addBookmark;
  945.   brandObject.utilities.uninstall = uninstall;
  946.   brandObject.utilities.firstRun = firstRun;
  947.   brandObject.utilities.switchBoom = switchBoom;
  948.   brandObject.utilities.toggleTheme = toggleTheme;
  949.   brandObject.utilities.updateKeywordSearch = updateKeywordSearch;
  950.   try {
  951.     Components.utils.import("resource://gre/modules/JSON.jsm", brandObject.utilities);
  952.     brandObject.utilities.JSON.stringify = brandObject.utilities.JSON.toString;
  953.     brandObject.utilities.JSON.parse = brandObject.utilities.JSON.fromString;
  954.   } catch (ex) {
  955.     /* Firefox 3.1 has native JSON support */
  956.     brandObject.utilities.JSON = JSON;
  957.   }
  958.  
  959.   try {
  960.     Components.utils.import("resource://gre/modules/LightweightThemeManager.jsm", brandObject.utilities);
  961.   } catch (ex) {
  962.   }
  963.  
  964.   var rdfs = Components.classes["@mozilla.org/rdf/rdf-service;1"]
  965.                        .getService(Components.interfaces.nsIRDFService);
  966.   var extensionDS= Components.classes["@mozilla.org/extensions/manager;1"]
  967.                              .getService(Components.interfaces.nsIExtensionManager).datasource;
  968.   var extension = rdfs.GetResource("urn:mozilla:item:" + brandObject.extensionID);
  969.  
  970.   var arc = rdfs.GetResource("http://www.mozilla.org/2004/em-rdf#updateURL");
  971.   var updateURL = extensionDS.GetTarget(extension, arc, true);
  972.   if (updateURL) {
  973.     AMO = false;
  974.   } else {
  975.     AMO = true;
  976.   }
  977.  
  978.   /* So other clients won't call our BrandThunder.initialize */
  979.   delete BrandThunder.initialize;
  980. }
  981.